TerraformでAWS CodeCommitのGit認証情報を生成してAWS Systems Manager Parameter StoreやAWS Secrets Managerに保存する
「Terraformで作ったCodeCommitのGit認証情報をいい感じに管理したい」
GitLabリポジトリをCodeCommitにミラーリングしたい時がありました。
以下の記事で設定できました。(感謝!)
GitLabのリポジトリをCodeCommitにミラーリングする流れとしては、以下になります。
- CodeCommit作成
- IAMポリシーとIAMユーザー作成
- CodeCommit Git認証情報の作成
- GitLabにてミラーリングの設定(Git認証情報をセット)
Terraformを使うにあたり、「3.CodeCommit Git認証情報の作成」の部分で作成するGit認証情報の管理すればいいんだろうと少し悩みました。
結論:
- Git認証情報の作成: 「aws_iam_service_specific_credential」で作成可能
- 認証情報の管理: SystemManager ParameterStoreかSecretsManagerに保存
サンプルコード交えて方法を紹介します。
やってみる
AWS CodeCommitのリポジトリ・IAM関連リソース・Git認証情報の作成
リポジトリとCodeCommit用のIAMユーザーとIAMグループ、Git認証情報を作成しています。
Git認証情報はaws_iam_service_specific_credential
で作成できます。
ちなみに、terraform-provider-aws v4.1.0(2022/2)以前ではCodeCommitの認証情報を作成することはできず、local-execを使用する必要がありました。
Feature request: IAM Service Specific credentials · Issue #3233 · hashicorp/terraform-provider-aws
resource "aws_iam_user" "codecommit" { name = "codecommit-user" path = "/" } resource "aws_iam_user_group_membership" "codecommit" { user = aws_iam_user.codecommit.name groups = [ aws_iam_group.codecommit.name, ] } resource "aws_iam_service_specific_credential" "codecommit" { service_name = "codecommit.amazonaws.com" user_name = aws_iam_user.codecommit.name } resource "aws_iam_group" "codecommit" { name = "codecommit-group" path = "/" } resource "aws_iam_policy" "codecommit" { name = "codecommit-group-policy" policy = data.aws_iam_policy_document.codecommit.json } data "aws_iam_policy_document" "codecommit" { statement { effect = "Allow" actions = ["codecommit:GitPull", "codecommit:GitPush"] resources = ["arn:aws:codecommit:${data.aws_region.current.name}:${data.aws_caller_identity.current.id}:*"] } } resource "aws_iam_group_policy_attachment" "codecommit" { group = aws_iam_group.codecommit.name policy_arn = aws_iam_policy.codecommit.arn }
Git認証情報の登録
上記で、Git認証情報の作成ができました。
Outputsに出したりtfstateを確認すればGit認証情報は確認できますが、Systems Manager Parameter Storeや SecretsManagerに値を保存した方が管理しやすいかと思います。
どちらを使うかはお好みですが、それぞれ紹介します。
Systems Manager Parameter Store
resource "aws_ssm_parameter" "codecommit_username" { name = "codecommit-username" type = "SecureString" value = aws_iam_service_specific_credential.codecommit.service_user_name } resource "aws_ssm_parameter" "codecommit_password" { name = "codecommit-password" type = "SecureString" value = aws_iam_service_specific_credential.codecommit.service_password }
SecretsManager
resource "aws_secretsmanager_secret" "codecommit" { name = "codecommit-git-secrets" } resource "aws_secretsmanager_secret_version" "codecommit" { secret_id = aws_secretsmanager_secret.codecommit.id secret_string = jsonencode({ "UserName" : aws_iam_service_specific_credential.codecommit.service_user_name, "Password" : aws_iam_service_specific_credential.codecommit.service_password, }) }
おわりに
個人的には、こういった情報(Git認証情報)はキーバリューで管理したいのでSecretsManagerを選ぶことが多いです。
SecretsManagerとParameter Storeの違いは以下がわかりやすいです。
Q: Secrets Manager と Parameter Store の違いは何ですか? AWS Systems Manager のよくある質問
以上、AWS事業本部の佐藤(@chari7311)でした。